<?php

/**
 * 前端添加自定义设备数据，增删改查接口
 */
if (!class_exists('DEMA_Admin_Interface_Table_Style')) {
    class DEMA_Admin_Interface_Table_Style extends DEMA_Admin_Interface
    {
        //表名
        public static $style_table_name;
        public static function run()
        {
            // 增 - 自定义设备添加信息接口
            add_action('wp_ajax_add_style_device_data_callback',  array(__CLASS__, 'add_style_device_data_callback'));

            //删
            add_action('wp_ajax_delete_style_device_data_callback',  array(__CLASS__, 'delete_style_device_data_callback'));

            //改
            add_action('wp_ajax_update_style_device_data_callback',  array(__CLASS__, 'update_style_device_data_callback'));

            //提供自定义设备分类列表接口
            add_action('wp_ajax_get_style_device_categories_callback',  array(__CLASS__, 'get_style_device_categories_callback'));
        }

        /**
         * 自定义设备分类数据接口
         */
        public static function get_style_device_categories_callback()
        {
            global $wpdb;
            $table_name = $wpdb->prefix . self::$table_style_name;

            // 获取所有设备分类
            $categories = $wpdb->get_results(
                "SELECT DISTINCT category FROM {$table_name} WHERE category IS NOT NULL AND category != ''"
            );

            // 获取所有状态分类
            $states = $wpdb->get_results(
                "SELECT DISTINCT state FROM {$table_name} WHERE state IS NOT NULL AND state != ''"
            );

            // 获取所有采购平台
            $platforms = $wpdb->get_results(
                "SELECT DISTINCT JSON_EXTRACT(data, '$.platform') as platform FROM {$table_name} WHERE JSON_EXTRACT(data, '$.platform') IS NOT NULL AND JSON_EXTRACT(data, '$.platform') != ''"
            );

            // 获取所有支付方式
            $pay_methods = $wpdb->get_results(
                "SELECT DISTINCT JSON_EXTRACT(data, '$.pay_method') as pay_method FROM {$table_name} WHERE JSON_EXTRACT(data, '$.pay_method') IS NOT NULL AND JSON_EXTRACT(data, '$.pay_method') != ''"
            );

            // 检查查询是否成功
            if ($wpdb->last_error) {
                wp_send_json_error(['error' => $wpdb->last_error], 500);
                wp_die();
            }

            // 整理分类数据
            $category_result = array_map(function ($item) {
                return [
                    'value' => $item->category,
                    'label' => $item->category
                ];
            }, $categories);

            // 定义状态映射关系，与PC设备保持一致
            $state_labels = [
                '使用' => '使用',
                '闲置' => '闲置',
                '故障' => '故障',
                '维修' => '维修',
                '报废' => '报废'
            ];

            // 获取数据库中实际存在的状态值
            $existing_states = array_column($states, 'state');

            // 确保所有预定义的状态选项都包含在结果中
            $state_result = [];
            foreach ($state_labels as $value => $label) {
                $state_result[] = [
                    'value' => $value,
                    'label' => $label
                ];
            }

            // 如果数据库中有其他未预定义的状态，也添加进去
            foreach ($existing_states as $state) {
                // 只添加不在预定义列表中的状态
                if (!array_key_exists($state, $state_labels)) {
                    $state_result[] = [
                        'value' => $state,
                        'label' => $state
                    ];
                }
            }

            // 定义采购平台映射关系
            $platform_labels = [
                '京东' => '京东',
                '淘宝' => '淘宝',
                '拼多多' => '拼多多',
                '美团' => '美团',
                '闲鱼' => '闲鱼',
                '线下' => '线下',
            ];

            // 获取数据库中实际存在的采购平台值
            $existing_platforms = array_column($platforms, 'platform');

            // 确保所有预定义的采购平台选项都包含在结果中
            $platform_result = [];
            foreach ($platform_labels as $value => $label) {
                $platform_result[] = [
                    'value' => $value,
                    'label' => $label
                ];
            }

            // 如果数据库中有其他未预定义的采购平台，也添加进去
            foreach ($existing_platforms as $platform) {
                // 只添加不在预定义列表中的采购平台
                if (!array_key_exists($platform, $platform_labels)) {
                    $platform_result[] = [
                        'value' => $platform,
                        'label' => $platform
                    ];
                }
            }

            // 定义支付方式映射关系
            $pay_method_labels = [
                '支付宝' => '支付宝',
                '微信' => '微信',
                '现金' => '现金',
            ];

            // 获取数据库中实际存在的支付方式值
            $existing_pay_methods = array_column($pay_methods, 'pay_method');

            // 确保所有预定义的支付方式选项都包含在结果中
            $pay_method_result = [];
            foreach ($pay_method_labels as $value => $label) {
                $pay_method_result[] = [
                    'value' => $value,
                    'label' => $label
                ];
            }

            // 如果数据库中有其他未预定义的支付方式，也添加进去
            foreach ($existing_pay_methods as $pay_method) {
                // 只添加不在预定义列表中的支付方式
                if (!array_key_exists($pay_method, $pay_method_labels)) {
                    $pay_method_result[] = [
                        'value' => $pay_method,
                        'label' => $pay_method
                    ];
                }
            }

            // 组合结果，统一键名格式
            $result = [
                'states' => array_values($state_result),        // 状态
                'categories' => array_values($category_result), // 分类（统一命名）
                'platforms' => array_values($platform_result),  // 采购平台
                'pay_methods' => array_values($pay_method_result) // 支付方式
            ];

            wp_send_json_success($result);
            wp_die();
        }


        /**
         * 增- 添加自定义设备数据接口
         */
        public static function add_style_device_data_callback()
        {
            global $wpdb;
            $table_name = $wpdb->prefix . self::$table_style_name;

            // 获取前端传递的参数并进行输入验证，如果有值，肯定是字符串类型
            $name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : null; //使用人
            $number = isset($_POST['number']) ? sanitize_text_field($_POST['number']) : null; //编号
            $category = isset($_POST['category']) ? sanitize_text_field($_POST['category']) : null; //设备分类
            $purpose = isset($_POST['purpose']) ? sanitize_text_field($_POST['purpose']) : null; //设备用途
            $state = isset($_POST['state']) ? sanitize_text_field($_POST['state']) : null; //设备状态
            $data = isset($_POST['data']) ? stripslashes($_POST['data']) : null; //设备信息

            //是否缺少参数
            $variables = compact('name', 'number', 'category', 'purpose', 'state', 'data');

            // 检查是否有参数为 null
            $null_param = array_search(null, $variables, true);

            // 如果有参数为 null，则返回相应的错误消息
            if ($null_param !== false) {
                $param_names = [
                    'name' => 'name - 使用人姓名',
                    'number' => 'number - 设备编号',
                    'category' => 'category - 设备分类',
                    'purpose' => 'purpose - 用途',
                    'state' => 'state - 设备状态',
                    'data' => 'data - 设备数据'
                ];
                wp_send_json_error(['error' => '缺少参数：' . $param_names[$null_param]], 400);
                wp_die();
            }

            //防止空数据
            if (empty($data) || !is_string($data)) {
                wp_send_json_error(['error' => 'data 参数为空或不是字符串'], 400);
                wp_die();
            }

            // 解析并重新编码JSON数据
            $json_data = json_decode($data, true);

            // 检查JSON解析是否成功
            if (json_last_error() !== JSON_ERROR_NONE) {
                wp_send_json_error(['error' => 'JSON解析失败: ' . json_last_error_msg()], 400);
                wp_die();
            }

            // 对象转JSON
            $json = json_encode($json_data, JSON_UNESCAPED_UNICODE);

            // 使用预处理语句插入数据
            $result = $wpdb->insert(
                $table_name,
                array(
                    'name' => $name,
                    'number' => $number,
                    'state' => $state,
                    'category' => $category,
                    'purpose' => $purpose,
                    'data' => $json
                ),
                array(
                    '%s', // name
                    '%s', // number
                    '%s', // category
                    '%s', // purpose
                    '%s', // state
                    '%s'  // data
                )
            );

            // 检查插入是否成功
            if ($result !== false) {
                // 插入成功后，获取自动生成的ID、UUID和time
                $inserted_id = $wpdb->insert_id;

                // 从数据库中查询刚插入的记录，获取自动生成的UUID和created_at
                $inserted_record = $wpdb->get_row($wpdb->prepare(
                    "SELECT uuid, created_at FROM $table_name WHERE id = %d",
                    $inserted_id
                ));

                // 检查是否成功获取记录
                if ($inserted_record === null) {
                    wp_send_json_error([
                        'error' => '无法获取刚插入的记录',
                        'inserted_id' => $inserted_id,
                        'table_name' => $table_name
                    ], 500);
                    wp_die();
                }

                $inserted_uuid = $inserted_record->uuid;
                $inserted_created_at = $inserted_record->created_at;

                //返回对应的值给本地用，方便在不刷新页面的情况下获取正常的数据，便于后续设置用
                wp_send_json_success([
                    'message' => '添加自定义设备数据成功',
                    'id' => $inserted_id,
                    'uuid' => $inserted_uuid,
                    'created_at' => $inserted_created_at
                ]);
            } else {
                wp_send_json_error([
                    'error' => '添加自定义设备数据失败，请排查错误',
                    'reason' => $wpdb->last_error
                ], 500);
            }

            wp_die();
        }

        /**
         * 删
         * 接收指定UUID，删除对应内容
         */
        public static function delete_style_device_data_callback()
        {
            global $wpdb;
            $table_name = $wpdb->prefix . self::$table_style_name;
            $table_auto = $wpdb->prefix . self::$table_auto_name;

            // 获取前端传递的参数并进行输入验证，如果有值，肯定是字符串类型
            $uuid = isset($_POST['uuid']) ? sanitize_text_field($_POST['uuid']) : null; //生成的uuid

            if (empty($uuid)) {
                wp_send_json_error(['error' => '缺少参数：uuid'], 400);
                wp_die();
            }

            //检查数据库是否存在传来的UUID
            $exists = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $table_name WHERE uuid = %s", $uuid));
            if ($exists == 0) {
                wp_send_json_error(['error' => '指定的UUID不存在'], 404);
                wp_die();
            }

            // 开始事务以确保数据一致性
            $wpdb->query('START TRANSACTION');

            try {
                // 执行删除操作
                $result = $wpdb->delete(
                    $table_name,
                    array('uuid' => $uuid), // WHERE 条件
                    array('%s') // uuid 类型
                );

                // 同时从$table_auto_name表中删除record_uuid为相同UUID的记录
                $result_auto = $wpdb->delete(
                    $table_auto,
                    array('record_uuid' => $uuid),
                    array('%s')
                );

                if ($result !== false && $result_auto !== false) {
                    // 提交事务
                    $wpdb->query('COMMIT');
                    wp_send_json_success(['message' => '删除成功']);
                } else {
                    throw new Exception('删除操作失败');
                }
            } catch (Exception $e) {
                // 回滚事务
                $wpdb->query('ROLLBACK');
                wp_send_json_error([
                    'error' => '删除失败',
                    'reason' => $wpdb->last_error ?: $e->getMessage()
                ], 500);
            }

            wp_die();
        }

        /**
         * 改
         * 根据传来的UUID，进行数据替换
         */
        public static function update_style_device_data_callback()
        {
            global $wpdb;
            $table_name = $wpdb->prefix . self::$table_style_name;

            // 获取前端传递的参数并进行输入验证，如果有值，肯定是字符串类型
            $uuid = isset($_POST['uuid']) ? sanitize_text_field($_POST['uuid']) : null; //生成的uuid
            $name = isset($_POST['name']) ? sanitize_text_field($_POST['name']) : null; //使用人
            $number = isset($_POST['number']) ? sanitize_text_field($_POST['number']) : null;
            $category = isset($_POST['category']) ? sanitize_text_field($_POST['category']) : null;
            $purpose = isset($_POST['purpose']) ? sanitize_text_field($_POST['purpose']) : null; //设备用途
            $state = isset($_POST['state']) ? sanitize_text_field($_POST['state']) : null; //设备状态
            $data = isset($_POST['data']) ? stripslashes($_POST['data']) : null; //设备信息

            //是否缺少参数
            $variables = compact('uuid', 'name', 'number', 'category', 'purpose', 'state', 'data');

            // 检查是否有参数为 null
            $null_param = array_search(null, $variables, true);

            // 特别检查uuid是否为空字符串
            if ($uuid === '' || $uuid === false) {
                $null_param = 'uuid';
            }

            // 如果有参数为 null，则返回相应的错误消息
            if ($null_param !== false) {
                $param_names = [
                    'uuid' => 'uuid - 设备唯一编号',
                    'name' => 'name - 使用人姓名',
                    'number' => 'number - 设备编号',
                    'category' => 'category - 设备类别',
                    'purpose' => 'purpose - 用途',
                    'state' => 'state - 设备状态',
                    'data' => 'data - 设备数据'
                ];
                wp_send_json_error(['error' => '缺少参数：' . $param_names[$null_param]], 400);
                wp_die();
            }

            //防止空数据
            if (empty($data) || !is_string($data)) {
                wp_send_json_error(['error' => 'data 参数为空或不是字符串'], 400);
                wp_die();
            }

            // 解析并重新编码JSON数据
            $json_data = json_decode($data, true);

            // 检查JSON解析是否成功
            if (json_last_error() !== JSON_ERROR_NONE) {
                wp_send_json_error(['error' => 'JSON解析失败: ' . json_last_error_msg()], 400);
                wp_die();
            }

            // 对象转JSON
            $json = json_encode($json_data, JSON_UNESCAPED_UNICODE);

            // 执行更新操作
            $result = $wpdb->update(
                $table_name,
                array(
                    'name' => $name,
                    'number' => $number,
                    'category' => $category,
                    'purpose' => $purpose,
                    'state' => $state,
                    'data' => $json
                ),
                array('uuid' => $uuid), // WHERE 条件
                array(
                    '%s', // name
                    '%s', // number
                    '%s', // category
                    '%s', // purpose
                    '%s', // state
                    '%s'  // data
                ),
                array('%s') // WHERE 条件类型
            );

            // 检查更新是否成功
            if ($result !== false) {
                wp_send_json_success([
                    'message' => '更新自定义设备数据成功'
                ]);
            } else {
                wp_send_json_error([
                    'error' => '更新自定义设备数据失败',
                    'reason' => $wpdb->last_error
                ], 500);
            }

            wp_die();
        }
    }
}
